#ifndef MEM_H
#define MEM_H

#ifndef UINT16_MAX
    #define UINT16_MAX  65536
#endif

template<
    typename word_t  // 机器字长
>
class MEM
{
private:
    /**
     * 虚拟机内存 
     * 共 65536 个内存位置 
     * 每个位置可以存储一个 16-bit 的值
     * 共可存储 128KB 数据 （64K*2Byte）
     */
    word_t memory[UINT16_MAX];

    /**
     * 内存映射寄存器（MMR）
     * 将I/O端口映射到内存
     * 以方便将外设数据读入内存中
     */
    enum {
        MR_KBSR = 0xFE00,   // 键盘状态端口
        MR_KBDR = 0xFE02    // 键盘数据端口
    };
public:
    /* 获取内存数组 */
    word_t* get_memory();
    word_t  get_memsize();
    
    /* 内存操作 */
    void    init();                         // 内存初始化 
    word_t  read(word_t);                   // 内存读
    void    write(word_t , word_t);         // 内存写
    word_t  swap16(word_t);                 // 16 位数字节交换，用于大小端存储的转换
    word_t* alloc_addr(word_t);             // 分配内存地址

    /* 定义内存访问外设的钩子 */
    int    (*check_key)();                  // 监听键盘
    word_t (*read_key)();                   // 从键盘输入
    void   (*load_image)();                 // 从磁盘加载文件镜像 
};


#endif